#ifndef __IPZ_ZBC_API_H_
#define __IPZ_ZBC_API_H_


#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */


typedef enum ptzCmdType {
	CMD_STOP = 0,
	CMD_ZOOM_IN,		/* 变倍前调 */
	CMD_ZOOM_OUT,		/* 变倍后调 */
	CMD_FOCUS_IN,		/* 聚焦前调 */
	CMD_FOCUS_OUT,		/* 聚焦后调 */

	CMD_VISCA_CONNECTED = 50,	/* visca检测到云台连接正常 */
	CMD_VISCA_RESET,			/* visca 相机重置状态 */

} ptzCmdType;

/// 回调数据包
typedef struct ZBCApiDataPacket
{
	ptzCmdType	cmd_type; 		//命令类型
	int 		res[64];		//保留字段

}ZBCApiDataPacket;

///在线升级回调数据包
typedef struct UpdateDataPacket
{
	int				dataLen; 		//数据长度
	unsigned char*	dataBuf;		//升级数据内容

}UpdateDataPacket;


//回调函数指针
typedef void (*notifyZbcApiCallback)(ZBCApiDataPacket* packet, void* pUser);

//在线升级回调数据函数指针
typedef void (*notifyReadUpgradeDataCallback)(UpdateDataPacket* packetStr, void* pUser);


///提供给ZBC接口描述信息
typedef struct ZBCInterfaceDesc {
	notifyZbcApiCallback fcallback;
	notifyReadUpgradeDataCallback fcallback1;
	void*			pUser;
	int reserved[28];			///< 保留

} ZBCInterfaceDesc;

//在线升级信息反馈
int IPZ_ZBC_writeUpgradeData(UpdateDataPacket* packet);


/// \param [in] desc  回调函数接口描述结构Desc指针
/// \param [out] desc 视频编码接口指针的指针
/// \retval <0 创建失败
/// \retval 0 创建成功

////初始化底层注册接口
int IPZ_ZBC_initZBCInterface(ZBCInterfaceDesc *desc);



typedef struct
{
    unsigned int  baudrate; ///< 波特率 0－50，1－75，2－110，3－150，4－300，5－600，6－1200，7－2400，8－4800，9－9600，10－19200， 11－38400，12－57600，13－76800，14－115200; */
    unsigned char databits; ///< 数据有几位 0－5位，1－6位，2－7位，3－8位
    unsigned char stopbits; ///< 停止位 0－1位，1－2位
    unsigned char parity; ///< 校验 0－无校验，1－奇校验，2－偶校验 */
    unsigned char flowcontrol; ///< 0－无，1－软流控，2-硬流控 */
    unsigned int  workMode; ///< 工作模式，0－232串口用于参数控制，1－透明通道 */
	unsigned char address; ///< 串口地址
}rs232_cfg;

extern void IPZ_ZBC_Init(void);
extern int  IPZ_ZBC_Cmd2Lib(int cmd,int cmd2,int cmd3,signed int value1,void *value2);

/*--------------------------获取曲线zoom和focus-----------------------------------------*/
/*
    func:  IPZ_ZBC_CMD_GetCurveZoom 获取zoom
    input: 无
    output: unsigned short *pu16CurveNum 曲线数量指针，最大200
           short *curve 曲线数组，最大200个
    return :0,成功；-1失败

*/
extern int IPZ_ZBC_CMD_GetCurveZoom(unsigned short *pu16CurveNum,short *curve);
/*
    func:  IPZ_ZBC_CMD_ReadCurveFocus 获取各物距下的focus
    input:  unsigned short u16CurveNum曲线数量，最大200
    output: short curve[6][200] 曲线二维数组，最大200个，获取六组，1m5,3m,6m,10m,20m,50m
    return :0,成功；-1失败
*/
extern int IPZ_ZBC_CMD_ReadCurveFocus(short curve[8][200]);

/*
    FUNC:IPZ_ZBC_CMD_DeleteCurve 删除设备中的曲线文件
    input:
    output:
    return :0,成功；-1失败
*/
extern int IPZ_ZBC_CMD_DeleteCurve(void);

/*
    FUNC:IPZ_ZBC_CMD_ZoomPosition 获取Zoom坐标位置
    input:
    output: z坐标 
    return :0,成功；-1失败
*/
int IPZ_ZBC_CMD_ZoomPosition(int *z);

/*
    FUNC:IPZ_ZBC_CMD_ZoomPosition 获取PT坐标位置
    input:
    output: p坐标 t坐标
    return :0,成功；-1失败
*/
int IPZ_ZBC_CMD_PTPosition(int *p,int *t);

/*
    FUNC:IPZ_ZBC_CMD_SetICR 切换ICR的状态
    input: int value 0:白天/1:夜晚/2:雾
    output: 无
    return :0,成功；-1失败
*/
int IPZ_ZBC_CMD_SetICR(int value);

/*
    FUNC:IPZ_ZBC_CMD_GetICR 获取当前ICR的状态
    input: none
    output: none
    return :0:day 1:night
*/
unsigned char IPZ_ZBC_CMD_GetICR();


/*
    FUNC:IPZ_ZBC_CMD_GetViscaICR 切换ICR的状态
    input: none
    output: none
    return :0:day 1:night
*/
unsigned char IPZ_ZBC_CMD_GetViscaICR();
/*
    FUNC:IPZ_ZBC_API_GotoFocusPos
    input:goto focus current position（实际坐标）
*/
void IPZ_ZBC_API_GotoFocusPos(int N,int gotoFocusPos);

/*
    FUNC:IPZ_ZBC_API_GetFocusCurPos
    return:focus current position（实际坐标）
*/
int IPZ_ZBC_API_GetFocusCurPos(void);


/*
    FUNC:IPZ_ZBC_API_GetFocusCoord
    return:focus sony coord
*/
int IPZ_ZBC_API_GetFocusCoord(void);

/*
    FUNC:IPZ_ZBC_API_GetZoomCoord
    return:zoom sony coord 
           if zoom>0x4000 数字变倍 
           if zoom<=0x4000 光学变倍
*/
int IPZ_ZBC_API_GetZoomCoord(void);


/*
    FUNC:IPZ_ZBC_API_GotoZoomFocus
    intput:zoom focus sony coord
    output:0 success
*/
int IPZ_ZBC_API_GotoZoomFocus(int zoom,int focus);

/*
    FUNC:IPZ_ZBC_API_SetLensPI
    intput:none
    output:lens PI
*/
short IPZ_ZBC_API_GetLensPI(void);
/*
    FUNC:IPZ_ZBC_API_SetLensPI
    intput:lens PI
    output:0 success,-1 failed
*/
int IPZ_ZBC_API_SetLensPI(short s16LZ1Diff);

/*
    FUNC:IPZ_ZBC_API_SetRS232_Config
    intput:RS232 config 
    output:0 success,-1 failed
*/
int IPZ_ZBC_API_SetRS232_Config(rs232_cfg cfg);

/*
    FUNC:IPZ_ZBC_API_SetPanTilt
    intput:RS485 Set pan and tilt 
    output:none
*/
void IPZ_ZBC_API_SetPanTilt(int pan,int tilt);

/*
    FUNC:IPZ_ZBC_API_Get_Iris
    intput:none 
    output:get iris value 0-100
*/
unsigned char IPZ_ZBC_API_Get_Iris(void);

/*
    FUNC:IPZ_ZBC_API_GotoZoomRation
    intput:zoom ration
    output:0 success
*/
int IPZ_ZBC_API_GotoZoomRation(int zoomRation);

/*
    FUNC:IPZ_ZBC_API_SetZoomLimit
    intput:SW_BOOL b (1:set zoom Max, 0:set zoom Min);
    SW_INT16 limit (set IPZ_ZBC_API_NowZoom func return back value)
    output:0 success
*/
int IPZ_ZBC_API_SetZoomLimit(char b,int limit);

/*
    FUNC:IPZ_ZBC_API_NowZoom
    intput:none
    output:limit ratio current zoom position value data
*/
int IPZ_ZBC_API_NowZoom(void);

/*
    FUNC:IPZ_ZBC_API_SetLensOffset
    intput: int zoom, int focus, int zoomc
    output:0 success
*/
int IPZ_ZBC_API_SetLensOffset(int           zoomBlankStep, int focusBlankStep, int zoomCBlankStep);
/*
    FUNC:IPZ_ZBC_API_GetLensOffset
    intput: int* zoomBlankStep, int* focusBlankStep, int* zoomCBlankStep
    output:0 success
*/
int IPZ_ZBC_API_GetLensOffset(int* zoomBlankStep, int* focusBlankStep, int* zoomCBlankStep);

/*
    FUNC:IPZ_ZBC_API_SetTempDectState
    intput:set 0-off; 1-on; 
    output:none
*/
void IPZ_ZBC_API_SetApertAdjustState(unsigned int s32ApertAdjustState);


#define MAX_PRIVACY_MASK_NUM	30  ///< 隐私块最多30块
#define PRIVACY_MASK_NUM	8  ///< 隐私块最多30块
#define MAX_POLYGON_POINT_NUM   10  ///< 多边形最多10个顶点
/**
 *  @brief 多边形边界点对应的坐标
 */
typedef struct
{
	int x;
	int y;
}IPZ_ZBC_POINT_XY;
/**
 *  @brief 隐私块原始平面坐标
 */
typedef struct 
{
	IPZ_ZBC_POINT_XY		point[MAX_POLYGON_POINT_NUM]; ///< 多边形边界点,最多十个;
	unsigned int	point_num; ///< 多边形顶点数;
}IPZ_ZBC_PRIVACY_POINT;

/**
 *  @brief 单个隐私块结构体信息
 */
typedef struct
{
	unsigned char  	    bEnable; ///< 使能
	unsigned char		res1[3]; ///< 字节补齐
	IPZ_ZBC_PRIVACY_POINT 		PrivacyPoint; ///< 隐私块原始平面坐标
	int    	            longitude1; ///< 经度
	int    	            latitude1; ///< 纬度
	int    	            longitude2; ///< 经度
	int    	            latitude2; ///< 纬度
	int    	            longitude3; ///< 经度
	int    	            latitude3; ///< 纬度
	int    	            longitude4; ///< 经度
	int    	            latitude4; ///< 纬度
	int                 centerlongitude; ///< 隐私块中心经度
	int                 centerlatitude; ///< 隐私块中心维度
	unsigned int        zoomvalue; ///< 设隐私块时的变倍值
	unsigned int		zoomdownlimt; ///< 隐私块门限值:当前倍率大于该值时，隐私才能显示，当前倍率小于该值时，隐私不显示。该值为具体操作的倍率值的10倍
	unsigned int 		focusvalue;	///<设隐私块时的focus值
	unsigned char       lable[20]; ///< 标题
	unsigned char       maskType; ///< 遮盖类型 0-灰色 1-红色 2-黄色 3-蓝色 4-橙色 5-绿色 6-透明 7-半透明 8-马赛克
	unsigned char   	bPolygon; ///< 是否为规则四边形0==矩形1==不规则
	unsigned char		res2[2]; ///< 字节补齐
}IPZ_ZBC_PRIVACY_INFO;
/**
 *  @brief 所有隐私块结构体信息
 */
typedef struct
{
    unsigned char             wholeEnable; ///< 隐私块总使能 
    unsigned char             res[3];
	IPZ_ZBC_PRIVACY_INFO 	PrivacyInput[MAX_PRIVACY_MASK_NUM]; ///< 隐私快输入信息
}IPZ_ZBC_PRIVACY_GROUP;
/**
 *  @brief 隐私遮蔽算法最主要的结构体
 */
typedef struct
{
	int  			pan; ///< 电机水平角度
	int  			tilt; ///< 电机垂直角度
	int  			tilthalfAngle; ///< 垂直视场角半角	
	float			gratio; ///< 窗口比例
	unsigned int	delayTime; ///< 延迟时间，获取延时时间之前的pt坐标
	int             isPanReversed; ///< 水平翻转标志
	int             isTiltReversed; ///< 垂直翻转标志
	IPZ_ZBC_PRIVACY_GROUP	PrivacyGroup; ///< 隐私块组
}IPZ_ZBC_PRIVACY_PARAM_ARM;

///运动跟踪状态数据结构体
typedef struct
{
    int enable; 		//跟踪状态(0-跟踪停止，1-正在跟踪)
    unsigned int x;    	//运动跟踪坐标点，归一化的坐标[0, 1000]
    unsigned int y;
    unsigned int bottomX;
    unsigned int bottomY;
	unsigned char  	res[24];
}IPZ_AUTOMATIC_TRACK_PARAM;

///机芯运动跟踪状态数据结构体
typedef struct
{
    int panDirection; 		    //=0:停止; <0:后退（小坐标角度方向）；>0:前进（大坐标角度方向）
    int tiltDirection;    		//=0:停止; <0:后退（小坐标角度方向）；>0:前进（大坐标角度方向）
    int panSpeed;               //水平电机运动速度值（放大100倍），精度0.01°/s
    int tiltSpeed;              //垂直电机运动速度值（放大100倍），精度0.01°/s
}IPZ_AUTOTRACK_CTRL;


int IPZ_ZBC_API_SetPrivy(IPZ_ZBC_PRIVACY_PARAM_ARM *privymask,int id);/*设置隐私块信息*/
int IPZ_ZBC_API_SetPrivacyInfo(IPZ_ZBC_PRIVACY_PARAM_ARM *privymask);
//int IPZ_ZBC_API_GetPrivy(IPZ_ZBC_PrivyMask *privymask);/*获取隐私块信息*/

int IPZ_ZBC_API_DelAllPrivy();/*删除所有隐私信息*/

int IPZ_ZBC_API_DelOnePrivy(int id);/*删除单个隐私块*/
unsigned char IPZ_ZBC_API_GetPrivyWholeEnable();/*获取总隐私使能标志*/
void IPZ_ZBC_API_SetPrivyWholeEnable(unsigned char wholeEnable);/*设置总隐私使能*/
unsigned char IPZ_ZBC_API_GetPrivyOneEnable(int id);/*获取单个隐私使能标志*/
int IPZ_ZBC_API_DelAllPrivyInfo();/*删除所有隐私块信息 */

//智能运动跟踪(云台),return 0成功，-1失败
int IPZ_ZBC_API_AutoMaticTrack(IPZ_AUTOMATIC_TRACK_PARAM *autoMaticTrack);

//智能运动跟踪(机芯),return 0成功，-1失败
int IPZ_ZBC_API_AutoTrackCtrl(IPZ_AUTOTRACK_CTRL *autoTrackCtrl);

//发送232透明通道数据
int IPZ_ZBC_API_SerialPortDataSend(unsigned char * buf, int length);

//获取232透明通道数据
int IPZ_ZBC_API_SerialPortDataRecv(unsigned char * buf, int* length);

//应用层发送数据(应用层数据直接下发给云台外部)
int IPZ_ZBC_API_SendData(unsigned char * buf, int length);


/*---------------cmd.txt-------------------*/
/*
cmd = 0     设置

cmd   cmd1  cmd2   value1  value2
0      1     1      0       0		    ZOOM-
0      1     2      0       0           ZOOM+
0      1     3      0       0           ZOOM STOP
0      1     4      0       0		    FOCUS-
0      1     5      0       0           FOCUS+
0      1     6      0       0           FOCUS-STOP
0      1     7      0       0           IRIS-
0      1     8      0       0           IRIS+
0      1     9      0/1/2   0           ICR 切换 0:白天/1:夜晚/2:雾
0      1     10     0       0           
0      1     11     0       0           触发一次聚焦
0      1     12     0       0           镜头初始化
0      1     13     value   0           设置区域聚焦范围
0      1     14     0/1     0           设置PT状态 0:PT停止 1:PT运动 
0      1     15     0/1/2   null        设置对接模式 0:自动1:网络2:有visca  
0      1     16     null    null        触发检测球机
0      1     17     1-10s   null        设置检测时间

//光学防抖算法控制(特定型号设备ZN4286等)
0      1     20     0       0           高级选项 防抖打开
0      1     21     0       0           高级选项 防抖关闭
0      1     22     0       0           web配置页面 防抖打开
0      1     23     0       0           web配置页面 防抖关闭
0      1     24     0       0           web配置页面 防抖锁定开启
0      1     25     0       0           web配置页面 防抖锁定关闭
0      1     26     0       0           ptz运动启动通知算法
0      1     27     0       0           ptz运动停止通知算法

cmd   cmd1  cmd2   value1  value2
0      2     1      0/1/2     0		    聚焦模式   自动/半自动/手动
0      2     2      0/1       0         DZOOM模式  关闭/打开
0      2     3      0/1/2     0      	AF模式     normal/interval/triger ，设置0即可
0      2     4      0/1/2     0		    聚焦灵敏度 低/中/高
0      2     5      0-9       0         聚焦限位，10cm,30cm,1m,1m5,3m,6m,10m,20m,50m,inf
0      2     6      value     0         数字变倍限位 索尼坐标
0      2     7      0-7       0         区域聚焦，后续补充
0      2     8      value     0         变倍速度 0-7对应8个等级，0最慢
0      2     9      value     0         帧率
0      2     10     value     0         分辨率
0      2     11     value     0         宽动态模式
0      2     12     value     0         设备型号
0      2     13     value(1-100)        曝光手动模式下设置光圈的值
0      2     14     0/1/2/3             设置曝光模式
0      2     15     value(1-100)        曝光自动模式下设置最大限制
0      2     16     value(1-100)        曝光自动模式下设置最小限制
0      2     17     0/1/2/3             设置镜像状态 0关闭/1左右/2上下/3中心
0      2     18     0/1             	设置温度温漂状态 0关闭/1开启
0      2     19     1/2             	设置rs232控制模式
0      2     20     0/1             	0x00：默认开启设置AF动作（执行(预置点) zoom/focus坐标设置指令：8x 01 04 47 0p 0q 0r 0s 0t 0u 0v 0w FF 后，会根据聚焦模式设置启动AF聚焦动作）
                                        0x01：关闭设置AF动作（执行 zoom/focus坐标设置指令：8x 01 04 47 0p 0q 0r 0s 0t 0u 0v 0w FF 后，不启动AF聚焦动作）

cmd   cmd1  cmd2   value1  value2
0      3     1      0         0		    T2初始化
0      3     2      0         0         启动光圈测试
0      3     3      0         0      	启动PI测试
0      3     4      0         0		    启动INF测试
0      3     5      0         0         启动IM5测试
0      3     6      0	      0         初始化结束

cmd = 1   查询
cmd   cmd1  cmd2   value1  value2
1      1     1      0        0          查询球机是否连接  0:OF/1:ON/2:DETECT -1:参数错误
1      1     2      0        0          查询机芯镜头聚焦状态  0:NO/1:OK -1:参数错误
1      1     3      0        0          查询机芯镜头变倍状态  0:NO/1:OK -1:参数错误
1      1     4      0        0          查询云台pt电机运动 返回值 状态：（水平电机）bit  0:（         0:停止状态/1:运行状态）；（垂直电机）bit  1:（         0:停止状态/1:运行状态）

*/
/*--------------end-----------------------*/



#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */


#endif
